<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // 在函数调用后面使用  fn()   fn.call(obj)

        // call()  第一个参数表示新的this指向,后面的参数都是给函数的实参
        // apply() 第一个参数表示新的this指向，第二个参数必须是一个数组
        // bind()  第一个参数表示新的this指向，并不调用函数， 只返回这个函数   bind()()


        const obj1 = {
            name : 'cc' , 
            say : function() {
                console.log(this.age);
            }
        }

        const obj2 = {
            name : 'yy' , 
            age : 14 ,
            say : function() {
                console.log(this.name);
            }
        }

        obj1.say()  // cc

        // 改变了this指向之后才会执行
        obj1.say.call(obj2) ;   // yy






        // function fn(n , m) {
        //     console.log(this);
        //     console.log(n);   
        //     console.log(m);
        // }


        // fn(1,5)   // window   1


        // // fn.call(obj1 , 1 , 5) ;   // obj1

        // fn.apply(obj1 , [1,5]);   // 第二个参数必须是一个数组




        function fn(n) {
            console.log(this);
            console.log(n);
        }


        // fn(1)   // window   1


        // fn.call(obj1) ;   // obj1

        // fn.apply(obj1,[1]);   // 第二个参数必须是一个数组

        // 只改变了this指向   但是没有调用 , 返回了原来的函数
        // const f = fn.bind(obj1) ;
        // f(2)

        fn.bind(obj1)(5) ;



    </script>
    
</body>
</html>